/*
 * Copyright (C) a_leaf_knows_the_autumn.
 */
/*
    高性能内存池
 */
#ifndef _H_MEMPOOL_H_
#define _H_MEMPOOL_H_

#include <stdint.h>
#include <stdbool.h>


typedef struct chunk_s {
    void *next;             // 内存块头部字段，链接内存块
    unsigned long size;     // 内存块的大小
    uint8_t data[];         // 内存块的指针
} chunk_t;

typedef struct h_mempool_s {
    chunk_t *head;          // 内存chunk 链表头
    chunk_t *tail;          // 内存chunk 链表尾    
    uint32_t total;         // 初始总数
    uint32_t used;          // 已使用的
    uint32_t expand_num;    // 满的时候扩容的个数
    uint32_t chunk_size;    // chunk 的size
} h_mempool_t;

/* 
功能: 创建一个内存池
参数: 无
返回值: 内存池的指针
*/
h_mempool_t *h_mempool_new();

/* 
功能:初始化一个内存池
参数: 
    m 内存池针指针
    total 内存池初始大小
    expand_num 扩充的个数，传入0不进行扩充
    chunk_size 每个内存块的大小
返回值:  成功返回 true，失败返回 false。
*/
bool h_mempool_init(h_mempool_t *m, uint32_t total, uint32_t expand_num, uint32_t chunk_size);

/* 
功能: 从内存池获取一个内存块，如果无内存了，设置了扩容，则进行扩容并返回内存。
参数: 内存池指针
返回值: 内存块的指针
*/
void *h_mempool_get(h_mempool_t *m);

/* 
功能: 回收内存块
参数: 内存块指针
返回值: 无
*/
void h_mempool_put(h_mempool_t *m, void *data);

/* 
功能: 清空一个内存池
参数: 内存池指针
返回值: 无
*/
void h_mempool_clear(h_mempool_t *m);

/* 
功能: 销毁一个内存池
参数: 内存池指针
返回值: 无
*/
void h_mempool_destroy(h_mempool_t *m);

/* 
功能: 打印内存池状态
参数: 内存池指针
返回值: 无
*/
void h_mempool_print(h_mempool_t *m, bool detail);

#endif